fix(filesystem): log more permissions when deleting a file fails
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Fri, 25 Apr 2025 07:47:08 +0000 (09:47 +0200)
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>
Mon, 28 Apr 2025 09:46:41 +0000 (09:46 +0000)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/common/filesystembase.cpp
src/common/filesystembase.h

index fafd0eeba61be23a8f482f46bdc4f81922cfd280..88ace9a91b862f7fc792aed0949f2c8bd19608a5 100644 (file)
@@ -320,6 +320,11 @@ bool FileSystem::openAndSeekFileSharedRead(QFile *file, QString *errorOrNull, qi
 }
 
 #ifdef Q_OS_WIN
+std::filesystem::perms FileSystem::filePermissionsWinSymlinkSafe(const QString &filename)
+{
+    return std::filesystem::symlink_status(filename.toStdWString()).permissions();
+}
+
 std::filesystem::perms FileSystem::filePermissionsWin(const QString &filename)
 {
     return std::filesystem::status(filename.toStdWString()).permissions();
@@ -551,6 +556,31 @@ bool FileSystem::remove(const QString &fileName, QString *errorString)
             *errorString = f.errorString();
         }
         qCWarning(lcFileSystem()) << f.errorString() << fileName;
+
+#if defined Q_OS_WIN
+        const auto permissionsDisplayHelper = [] (std::filesystem::perms currentPermissions) {
+            const auto unitaryHelper = [currentPermissions] (std::filesystem::perms testedPermission, char permissionChar) {
+                return (static_cast<bool>(currentPermissions & testedPermission) ? permissionChar : '-');
+            };
+
+            qCInfo(lcFileSystem()) << unitaryHelper(std::filesystem::perms::owner_read, 'r')
+                                   << unitaryHelper(std::filesystem::perms::owner_write, 'w')
+                                   << unitaryHelper(std::filesystem::perms::owner_exec, 'x')
+                                   << unitaryHelper(std::filesystem::perms::group_read, 'r')
+                                   << unitaryHelper(std::filesystem::perms::group_write, 'w')
+                                   << unitaryHelper(std::filesystem::perms::group_exec, 'x')
+                                   << unitaryHelper(std::filesystem::perms::others_read, 'r')
+                                   << unitaryHelper(std::filesystem::perms::others_write, 'w')
+                                   << unitaryHelper(std::filesystem::perms::others_exec, 'x');
+        };
+
+        const auto unsafeFilePermissions = filePermissionsWin(fileName);
+        permissionsDisplayHelper(unsafeFilePermissions);
+
+        const auto safeFilePermissions = filePermissionsWinSymlinkSafe(fileName);
+        permissionsDisplayHelper(safeFilePermissions);
+#endif
+
         return false;
     }
     return true;
index e9547d2d0a7b66c05ba7e16f9f54cde61bcb79f2..481e765f638f43e1d7b13b608366414a7184e54c 100644 (file)
@@ -173,6 +173,7 @@ namespace FileSystem {
      */
     QString OCSYNC_EXPORT pathtoUNC(const QString &str);
 
+    std::filesystem::perms OCSYNC_EXPORT filePermissionsWinSymlinkSafe(const QString &filename);
     std::filesystem::perms OCSYNC_EXPORT filePermissionsWin(const QString &filename);
     void OCSYNC_EXPORT setFilePermissionsWin(const QString &filename, const std::filesystem::perms &perms);
 #endif